package com.nowcoder.community.community.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AlphaAspect {

    // execution为固定的关键字
    // 第一个"*"，表示方法的返回值，为任意返回值
    // 第二个"*"，表示类名，为任意类
    // 第三个"*"，表示方法名，为任意方法名
    // (..)，表示参数，为任意的参数
    @Pointcut("execution(* com.nowcoder.community.community.service.*.*(..))")
    public void pointCut(){

    }

    // 在连接点的开始织入代码
    @Before("pointCut()")
    public void before(){
        //System.out.println("before");
    }

    // 在连接点的结束织入代码
    @After("pointCut()")
    public void after(){
        //System.out.println("after");
    }

    // 在连接点的返回值以后织入代码
    @AfterReturning("pointCut()")
    public void afterReturning(){
        //System.out.println("afterReturning");
    }

    // 在抛出异常时织入代码
    @AfterThrowing("pointCut()")
    public void afterThrowing(){
        //System.out.println("afterThrowing");
    }

    // 既可在连接点的开始织入代码，也可在连接点的结束织入代码
//    @Around("pointCut()")
//    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
//        System.out.println("around before");// 在连接点的开始织入代码
//        Object obj = joinPoint.proceed();// proceed()方法为调用目标对象中要处理的方法
//        System.out.println("around after");// 在连接点的结束织入代码
//        return obj;
//    }

}
